package com.gljx.spring.timertask;

import com.gljx.constant.Constant;
import com.gljx.util.CommonUtil;
import com.gljx.web.Entity.Car;
import com.gljx.web.Entity.Message;
import com.gljx.web.Entity.Student;
import com.gljx.web.dao.MessageMapper;
import com.gljx.web.dao.SystemMapper;
import com.gljx.web.dao.UserMapper;
import org.apache.log4j.Logger;
import org.apache.shiro.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 同步eas用户
* @author LiXiang
* @date 2017年10月17日 上午10:25:08 
*
 */
@Component
@Service
public class TimertaskServiceImpl implements TimertaskService {
	@Scheduled(cron="0 20,40 0 1/1 * ? ")//1点20、40分执行一次
	@Override
	public void cleanUserMenu() {
		logger.info("###     清理用户菜单表     定时器工作@开始@                         ###");
			Map <String,Object > data = new HashMap<String, Object>();
			data.put("v_now_time", CommonUtil.subTime(day));//清空的时间判别
			data.put("v_PROJECTNUMBER", Constant.Project_ID);
			sysDao.cleanMenuMemory(data);
			String result = (String)data.get("v_result");
			if("other_error".equals(result)){
				logger.info("###     清理用户菜单表     定时器工作失败        ###");
			}else{
				logger.info("###     清理用户菜单表     定时器"+result+"        ###");
			}
		logger.info("###     清理用户菜单表     定时器工作@结束@        ###");
	}
	
	/**
	 * 用户同步工作器
	 */
	/*@Scheduled(cron="0 30 15 1/1 * ? ")//0点30分执行一次   //晚上0点到1点每隔20分钟一次  0 0/20 0-1 * * ?
    @Override
	public void syncUser() {
		logger.info("###     用户同步     定时器工作@开始@                         ###");
		int insertNum = 0;
		//插入部分
		for(User user:sysDao.selectEasCreatUser()){
			//如果数据库没有这条数据插入否则不处理。
			if(userDao.selectByPrimaryKey(user.getUserName(),Constant.Project_ID) == null){
				
				user.setCreatId(systemName);//系统定时器
				user.setCreatTime(CommonUtil.nowTime());//创建时间
				user.setPassword(defaultPwd);//默认密码
				Map<String, Object> data;
				try {
					data = CommonUtil.objectToMap(user, "v_",
							Arrays.asList(new String[] { "id","serialVersionUID","companyName","fisDelete","updateTime","updateId", "updateTime" }));
					userDao.insertUser(data);
					user.setId((Integer)data.get("v_id"));
					//加密密码
					user = PasswordHelper.encryptPassword(user);
					userDao.updateUser(user);
				} catch (IllegalAccessException e) {
					logger.error("#定时器插入数据异常#转型异常"+e);
					e.printStackTrace();
				}
				
				insertNum++;
			}
		}
		logger.info("      ##插入##："+insertNum+"条数据");
		User user = new User();
		user.setUpdateId(systemName);
		user.setUpdateTime(CommonUtil.nowTime());
		//修改
		int updateNum = sysDao.updateEasUpdateUser(user);
		logger.info("      ##修改##："+updateNum+"条数据");
		logger.info("      ###     用户同步          定时器工作@结束@                    ###");
	}*/
	
	/**
	 * 同步公司
	 */
	/*@Scheduled(cron="0 29 17 1/1 * ? ")
	@Override
	public void syncCompany() {
		logger.info("###     公司同步     定时器工作@开始@                         ###");
		Map <String,Object > data = new HashMap<String, Object>();
		try{
			sysDao.syncCompany(data);
			String result = (String) data.get("v_result");
			Integer insertNum = (Integer) data.get("v_insert_num");
			Integer updateNum = (Integer) data.get("v_update_num");
			if(!"success".equals(result)){
				logger.error("###     公司同步     数据库操作失败###");
			}else {
				logger.error("###     公司同步    @插入 "+insertNum+" 条     @修改 "+updateNum+" 条");
			}
		}catch(Exception e){
			logger.error("###     公司同步     失败###");
			e.printStackTrace();
		}
		
		logger.info("###     公司同步     定时器工作@结束@                         ###");
	}*/
	/**
	 * 同步部门
	 */
	/*@Scheduled(cron="0 29 17 1/1 * ? ")
	@Override
	public void syncDept() {
		logger.info("###     部门同步     定时器工作 @开始@                         ###");
		Map <String,Object > data = new HashMap<String, Object>();
		try{
			sysDao.syncDept(data);
			String result = (String) data.get("v_result");
			Integer insertNum = (Integer) data.get("v_insert_num");
			Integer updateNum = (Integer) data.get("v_update_num");
			if(!"success".equals(result)){
				logger.error("###     部门同步     数据库操作失败###");
			}else {
				logger.error("###     部门同步    @插入 "+insertNum+" 条     @修改 "+updateNum+" 条");
			}
		}catch(Exception e){
			logger.error("###     部门同步     失败###");
			e.printStackTrace();
		}
		logger.info("###     部门同步     定时器工作 @结束@                         ###");
	}*/

	@Override
	@Scheduled(cron="0 2 0 ? * MON ")//星期一两点
	public void threeYearCleanStud() {
		logger.info("###     学员 三年清零 @开始@   ###");
		Map <String,Object > data = new HashMap<String, Object>();
		data.put("v_year", month);
		sysDao.disCardStudent(data);
		if("success".equals((String)data.get("v_result")))
		{
			logger.info("### 修改了 "+data.get("v_update_num")+" 条数据为 三年清零");
		}else{
			logger.info("### 修改失败！！！"+data.get("v_message"));
		}

		logger.info("###     学员 三年清零 @结束@   ###");

        logger.info("###     三年清零、五次清零通知 @开始@   ###");


        //三年清零
        List<Student> list3 = sysDao.getStud(3);

        if(list3 !=null && list3.size()>0)
        {
			Message message = newMessage();
			//内容
            message.setMessage("三年清零：");

            List<Message> messages = this.setMessage(list3,message);

			logger.info("###    三年清零插入 "+messageDao.insertMessageList(messages)+" 条");
        }

        //五次清零
        List<Student> list5 = sysDao.getStud(5);
        if(list5 !=null && list5.size()>0)
        {
            Message message = newMessage();
            //内容
            message.setMessage("五次清零：");

            List<Message> messages = setMessage(list5,message);

			logger.info("###    五次清零插入 "+messageDao.insertMessageList(messages)+" 条");
        }


        logger.info("###     三年清零、五次清零通知 @结束@   ###");
	}


	/**
	 * 保险到期查询，一周一次
	 * @Author:  LiXiang 
	 * @Date: Created in 2018-07-02 11:42
	 */
	@Override
	@Scheduled(cron="0 3 3 ? * MON")//星期一3:3点   0 3 3 ? * MON
	public void carBXMessage() {
		logger.info("###     车辆 保险 @开始@   ###");


		//----------------------------商业险---------------------
		List<Car> cars = sysDao.getCar("SYX");
		if(null != cars && cars.size()>0)
		{
			Message message = newMessage();
			//内容
			message.setMessage("商业险即将到期：");
			//根据公司不同分为不同的通知消息
			List<Message> messages = setCarMessage(cars,message);

			logger.info("###    商业险插入 "+messageDao.insertMessageList(messages)+" 条");
		}
		//----------------------------交强险---------------------
		List<Car> cars2 = sysDao.getCar("JQX");
		if(null != cars2 && cars2.size()>0)
		{
			Message message = newMessage();
			//内容
			message.setMessage("交强险即将到期：");
			//根据公司不同分为不同的通知消息
			List<Message> messages = setCarMessage(cars2,message);

			logger.info("###    交强险插入 "+messageDao.insertMessageList(messages)+" 条");
		}
		logger.info("###     车辆 保险 @结束@   ###");
	}

	/**
	 * 年检到期查询，一个月一次
	 * @Author:  LiXiang 
	 * @Date: Created in 2018-07-02 11:43
	 */
	@Override
	@Scheduled(cron="0 30 3 1 * ?")//每月一号3:30点
	public void carNJMessage() {
		logger.info("###     车辆 年检 @开始@   ###");

		//----------------------------年检---------------------

		List<Car> cars = sysDao.getCar("NJ");
		if(null != cars && cars.size()>0)
		{
			Message message = newMessage();
			//内容
			message.setMessage("车辆年检即将到期：");
			//根据公司不同分为不同的通知消息
			List<Message> messages = setCarMessage(cars,message);

			logger.info("###    商业险插入 "+messageDao.insertMessageList(messages)+" 条");
		}
		logger.info("###     车辆 年检 @结束@   ###");
	}

	private Message newMessage(){
		Message message = new Message();
		//创建时间
		message.setCreatTime(CommonUtil.nowTimeSp("yyyy-MM-dd HH:mm"));
		//内容
		message.setMessage("五次清零：");
		//设置为通知类型
		message.setType(2);
		//设置为已读类型
		message.setIslook(1);
		//范围和优先级
		message.setScope(1);
		message.setLeavel(3);
		//项目标识
		message.setProjectid(Constant.Project_ID);
		return message;
	}

	private List<Message> setMessage(List<Student> list, Message msg) {

	    String msgStr = msg.getMessage();

        Map<String, Object> map = new HashMap<String, Object>();

        for (int i = 0; i < list.size(); i++) {
            Student student = list.get(i);
            //如果集合没有数据直接添加
            if (map.size() <= 0) {
                map.put(student.getCfficompanyid(), student.getFnameL2() + "  " + student.getFnumber());
            } else {
                //在原有基础上添加数据
                for (Map.Entry<String, Object> entry : map.entrySet()) {
                    if (entry.getKey().equals(student.getCfficompanyid())) {
                        map.put(student.getCfficompanyid(), map.get(student.getCfficompanyid()) + "," + student.getFnameL2() + "  " + student.getFnumber());
                        continue;
                    }
                }
                //如果没有找到对应的增加新的键值对
                map.put(student.getCfficompanyid(), map.get(student.getCfficompanyid()) + "," + student.getFnameL2() + "  " + student.getFnumber());
            }
        }
        List<Message> messages = new ArrayList<Message>();

        //遍历map将其数据根据公司ID存入
        for (Map.Entry<String, Object> entry : map.entrySet()) {
            //内容
            msg.setMessage(msgStr + (String) entry.getValue());
            //公司ID
            msg.setCompanyid(entry.getKey());
            messages.add(msg);
        }

        return messages;
    }
	private List<Message> setCarMessage(List<Car> list, Message msg) {

		String msgStr = msg.getMessage();

		Map<String, Object> map = new HashMap<String, Object>();

		for (int i = 0; i < list.size(); i++) {
			Car car = list.get(i);
			//如果集合没有数据直接添加
			if (map.size() <= 0) {
				//添加车型和车牌
				map.put(car.getCfficompanyid(), car.getFnameL2() + "  " + car.getFnumber());
			} else {
				//在原有基础上添加数据
				for (Map.Entry<String, Object> entry : map.entrySet()) {
					if (entry.getKey().equals(car.getCfficompanyid())) {
						map.put(car.getCfficompanyid(), map.get(car.getCfficompanyid()) + "," + car.getFnameL2() + "  " + car.getFnumber());
						continue;
					}
				}
				//如果没有找到对应的增加新的键值对
				map.put(car.getCfficompanyid(), map.get(car.getCfficompanyid()) + "," + car.getFnameL2() + "  " + car.getFnumber());
			}
		}
		List<Message> messages = new ArrayList<Message>();

		//遍历map将其数据根据公司ID存入
		for (Map.Entry<String, Object> entry : map.entrySet()) {
			//内容
			msg.setMessage(msgStr + (String) entry.getValue());
			//公司ID
			msg.setCompanyid(entry.getKey());
			messages.add(msg);
		}

		return messages;
	}
	private Logger logger = Logger.getLogger(getClass());
	//private  Logger log = Logger.getLogger("taskLog");  
	@Autowired
	private SystemMapper sysDao;
	
	@Autowired
	private UserMapper userDao;

	@Autowired
    private MessageMapper messageDao;

	/**
	 * 系统定时器在用户表中的ID
	 */
	@Value("${system.timertask.name}")
    private String systemName;  
	
	/**
	 * 默认密码
	 */
	@Value("${password.default}")
	private String defaultPwd;
	
	@Value("${system.timertask.day}")
	private Integer day;

	@Value("${student.clear.month}")
	private Integer month;
	
}
